package com.itlong.cloud.service;


import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.data.redis.core.HashOperations;

import java.util.Set;

/**
 * <desc>
 *      Redis工具接口类。
 * </desc>
 *
 * @createDate 2017/08/29
 */
public interface RedisService<T> {

    /**
     * <desc>
     *      保存字符串类型对象.
     * <desc/>
     *
     * @param k
     * @param v
     * @return boolean
     * @author Wenchao.L
     * @createDate
     */
    boolean set(String k, String v);

    /**
     * <desc>
     *      保存字符串类型对象（带时间）.
     * <desc/>
     *
     * @param k 键
     * @param time 时间
     * @param v 值
     * @return boolean
     * @author Wenchao.L
     * @createDate
     */
    boolean set(final String k, long time, final String v);

    /**
     * <desc>
     *      保存泛型对象.
     * <desc/>
     *
     * @param k 键
     * @param time 时间
     * @param t 值
     * @return boolean
     * @author Wenchao.L
     * @createDate
     */
    boolean set(String k, long time, T t);

    /**
     * <desc>
     *      获取泛型对象.
     * <desc/>
     *
     * @param k 键
     * @param t 值
     * @return 泛型对象数据
     * @author Wenchao.L
     * @createDate
     */
    T getObject(String k , Class<T> t);

    /**
     * <desc>
     *      获取字符串对象数据.
     * <desc/>
     *
     * @param k 键
     * @return 字符串对象数据
     * @author Wenchao.L
     * @createDate
     */
    String get(final String k);

    /**
     * <desc>
     *     删除指定key的缓存对象数据
     * </desc>
     * @param k 键
     * @return
     * * @author cuiduanwu
     * @createDate 2017/10/10
     */
    boolean del(String k);

    /**
     * <desc>
     *     删除指定key的缓存对象数据
     * </desc>
     * @param k 键
     * @return
     * * @author cuiduanwu
     * @createDate 2017/10/10
     */
    boolean delForDevice(String k);

    /**
     * <desc>
     *      获取泛型List对象.
     * <desc/>
     *
     * @param k 键
     * @param jsonTypeReference 对象
     * @return 泛型对象数据
     * @author Jiaqi.X
     * @createDate 2017/12/10
     */
    public T decodeObject(String k,TypeReference<T> jsonTypeReference);

    /**
     * <desc>
     *     批量获取相关前缀的key
     * </desc>
     * @param k 键
     * @return
     * * @author Qiang.S
     * @createDate 2019/01/18
     */
    Set<String> getKeys(final String k);

    /**
     * <desc>
     *     批量获取相关前缀的key
     * </desc>
     * @param k 键
     * @return
     * * @author Qiang.S
     * @createDate 2019/01/18
     */
    String getKeysForDevice(final String k);

    /*
     * <desc>
              获取分布式锁，保存字符串类型对象（带时间）.
     * <desc/>
     *
     * @param k     键
     * @param time  过期时间
     * @param v     值
     * @return boolean
     * @author pengwei
     * @createDate 2020/11/03
     */
    boolean setNx(final String k, long time,final String v);

    /**
     * 操作hash的句柄
     */
    HashOperations<String, String, Object> getHash();

}
